// UniqueID string The possible values are EXTERNAL, INTERNAL, CANCELLATIONEXTERNAL, and CANCELLATIONINTERNAL.

class Paragraph {
  constructor() {
    this.Text = '' // The text description of why the cancellation was made.
    this.Image = '' // Not used in this context.
    this.URL = '' // Not used in this context.
  }
}

class EncryptedSwipe {
  constructor() {
    this.TrackIndicator = null // string   The track indicator.
    this.SwiperType = null // string   The swiper type.
    this.SwiperID = null // string   The swiper ID.
    this.MaskedPAN = null // string   The Masked Primary Account Number.
    this.Track1 = null // string   The Track 1 data.
    this.Track2 = null // string   The Track 2 data.
    this.KeySerialNumber = null // string   The key track serial number.
  }
}

class VaultedCardType {
  constructor() {
    this.vaultedCardID = null // string   The vaulted card ID.
    this.lastFourDigits = null // string   The last four digits of the vaulted card ID.
  }
}

class CreditCard {
  constructor() {
    this.cardType = '' // string   The type of payment card (i.e. credit, Debit, voucher, etc.)
    this.otherCardType = '' // string   Not used in this context.
    this.chipAndPin = false // boolean   Indicates if the calling system can handle a chip and pin device. For example, when called from a Kiosk system this flag must be set to true so that the guest can swipe the card on a chip and pin device when the credit card vendor makes it active.  When called from the web, this flag needs to be set to false as the guest cannot swipe a credit card online.
    this.cardCode = '' // string   The credit card vendor code (i.e. VA, AX, etc.).
    this.cardHolderName = '' // string   The name on the face of the card.
    this.cardNumber = '' // string   The credit card number. Asian region will have local credit card with length of up to 30 numbers.
    this.VaultedCardData = null // VaultedCardType   The vaulted card type.
    this.seriesCode = '' // string   The credit card series code.
    this.Track2 = '' // string   Credit card track 2 data.
    this.effectiveDate = null // date   The first date that the card is active.
    this.expirationDate = null // date   The expiration date of the card.
    this.EncryptedSwipe = null // EncryptedSwipe   The encrypted swipe data for the credit card.
  }
}

class GuaranteeAccepted {
  constructor() {
    this.agentPhone = null // string   If the booking is on behalf of or guaranteed to a travel agent, then the travel agent’s phone number is required.
    this.GuaranteeCreditCard = null // CreditCard   If the booking is guaranteed to a credit card, then the credit card details are provided in this element.
    this.GuaranteeTravelAgent = null // UniqueID   If the booking is on behalf of or guaranteed to travel agent, then the agent’s IATA or other identification code is provided in this element.
    this.GuaranteeCompany = null // UniqueID   If the booking is guaranteed to a company, then the company’s Corp ID is provided in this element.
  }
}

class Guarantee {
  constructor() {
    this.guaranteeType = null // string   The guarantee type code.
    this.mandatoryDeposit = false // boolean   If a deposit is mandatory in order to secure the subject RoomStay, then this flag attribute always has a default value of “true.”
    this.cancellationRequired = false // boolean   Indicates if cancellation is required for the guarantee.
    this.creditCardRequired = false // boolean   Indicates if a credit card is required for the guarantee.
    this.paymentType = false // string   The payment type used.
    this.requirementCode = false // string   The requirement code.
    this.GuaranteesAccepted = [] // ArrayOfGuaranteeAccepted   If this booking is guaranteed against either a credit card or a travel agent, the appropriate details are stored here.
    this.Deadline = null // dateTime   Reserved for future use.
    this.GuaranteeDescription = null // Paragraph   Any written description of the guarantee.
  }
}

class HotelReservation {
  constructor() {
    this.reservationAction = '' // ReservationActionType   Indicates the activity for which the message is being sent. The possible values are ADD, EDIT, CANCEL, CHECKIN, CHECKOUT, NOSHOW, and REINSTATE.
    this.reservationStatus = '' // ReservationStatusType   The reservation status. The possible values are RESERVED, PROSPECT, NOSHOW, CANCELED, INHOUSE, CHECKEDOUT, CHANGED, WAITLISTED and PRECHECKEDIN.
    this.marketSegment = '' // string   The market segment used for the reservation.
    this.sourceCode = '' // string   The source code used for the reservation. The source code returned is the "Reservation Insert Source" rather than the Reservation Source Code.
    this.originCode = '' // string   The origin code.
    this.authorizer = '' // string   Not used for OWS.
    this.compRoutingFlag = '' // string   Not used for OWS.
    this.compRoutingAuthorizer = '' // string   Not used for OWS.
    this.onBehalfFlag = false // boolean   Populated when the reservation is for an On Behalf user.
    this.redemReservationFlag = false // boolean   Populated for a redemption reservation.
    this.insertUser = '' // string   The ID of the user who created the reservation.
    this.insertDate = '' // dateTime   The date when the reservation is created.
    this.updateUser = '' // string   The ID of the user who last updated the reservation.
    this.updateDate = '' // dateTime   The date when the reservation was last changed.
    this.inactiveDate = '' // date   Not used in this context.
    this.walkIn = false // boolean   An indication of whether or not this is a walkin reservation.
    this.noPost = false // boolean   An indication of whether or not the NoPost flag is actve.
    this.remoteCo = false // boolean   The third party authorization, validation, or settlement source.
    this.group = '' // string   Displays the name of the Block.
    this.attachPreferenceProfile = false // boolean   If true, the preference will be attached to the profile.
    this.allowPreRegisteration = false // boolean   Indicated whether the reservation is eligible for pre-registration.
    this.preRegisterFlag = false // boolean   Whether or not the reservation was pre-checked in over the internet. True indicates that the reservation was checked in over the internet. False indicates that it was not.
    this.keyExpirationDate = '' // dateTime   The expiration date of the existing room key.
    this.totalCreditCardSurcharges = '' // double   The total credit card surcharges to be applied.
    this.DoNotMoveRoom = false // boolean   Indicates whether the reservation may be moved to another room.
    this.OptIn = false // boolean   Indicates whether this guest may be contacted for future marketing campaigns.
    this.OptInComplete = false // boolean   Indicates whether the guest has already opted in (or out) to be contacted for future marketing campaigns.
    this.commentsExists = false // boolean   Indicates if comments exist for the reservation.
    this.commentsCount = '' // int   The number of comments on the reservation.
    this.tracesExists = false // boolean   Indicates if traces exist for the reservation.
    this.tracesCount = '' // int   The number of traces on the reservation.
    this.specialsExists = false // boolean   Indicates if specials exist for the reservation.
    this.specialsCount = '' // int   The number of special requests attached to the reservation.
    this.roomPreferenceExists = false // boolean   Indicates if room preferences exist for the reservation.
    this.roomPreferencesCount = '' // int   The number of room preferences attached to the reservation.
    this.shareExists = false // boolean   Indicates whether there are sharing guests on the reservation.
    this.queueExists = false // boolean   Indicates if the reservation has been placed into a queue.
    this.queueNumber = '' // int   The position in the queue for this reservation.
    this.alertExists = false // boolean   Indicates whether any alerts exist for this reservation.
    this.alertsCount = '' // int   The number of alerts attached to this reservation.
    this.messageExists = false // boolean   Indicates whether any messages exist for this reservation.
    this.messagesCount = '' // int   The number of messages attached to this reservation.
    this.checkOutTime = '' // time   The estimated Check-Out time for the reservation.
    this.computedReservationStatus = '' // ReservationStatusType   The status of the reservation (i.e. “Checked In”, etc).
    this.financialTransactionExists = false // boolean   Indicates whether any postings exist for this reservation.
    this.printRate = false // boolean   Indicates whether the room rate for this reservation will print on guest-facing documents.
    this.referralYN = '' // string   Indicates whether this reservation was referred from another entity.

    this.UniqueIDList = [] // ArrayOfUniqueID   A collection of UniqueID elements. In this context, they are populated with the internal reservation ID for parent booking.
    this.RoomStays = [] // ArrayOfRoomStay   A collection of sparsely populated RoomStays that provide an overview or summary of the future booking.
    this.ResGuests = [] // ArrayOfResGuest   A collection of sparsely populated ResGuests, providing only basic name information.
    this.WrittenConfInst = '' // WrittenConfInst   Used for confirmations.
    this.ReservationHistory = '' // History   The reservation history.
    this.UserDefinedValues = [] // ArrayOfUserDefinedValue   User defined values.
    this.Invoice = '' // BillHeader   Invoice header information.
    this.Preferences = '' // ArrayOfPreference   A collection of Preference elements.
    this.Alerts = '' // Alert   Details of any alerts attached to the reservation.
    this.PayRoutings = '' // ResPayRouting   Details of any charge routing configured on the reservation.
    this.PayMethods = '' // ResPayMethod   Details of payment methods defined for the reservation.
    this.AccompanyGuests = [] // ArrayOfAccompanyGuest   Details of any accompanying guests defined on the reservation.
    this.ECertificate = '' // ECertificate   Details of any e-certificates used for the reservation.
    this.ShareReservations = [] // ArrayOfShareReservation   Details of any sharing guests defined on the reservation.
    this.Miscellaneous = '' // MoreFields   Not in use at this time.
  }
}
